

/**
 * 将下面异步代码使用promise 的方式改进
 * **/
setTimeout(() => {
  var a = 'hello'
  setTimeout(() => {
    var b = 'lagou'
    setTimeout(() => {
      var c = 'I L U'
      // console.log(a + b + c)
    }, 10)
  }, 10)
}, 10);

/**
 * promise 优化
 * **/ 
Promise.resolve('hello').then((val) => {
  return val + 'lagou'
}).then((val) => {
  return val + 'I LOVE YOU'
}).then(val => {
  console.log(val) // hellolagouI LOVE YOU
})


// horsepower 马力， dollar_value  价格， in_stock 库存
const fp = require('lodash/fp')

const cars = [
  {
    name: 'FF',
    horsepower: 660,
    dollar_value: 700000,
    in_stock: true
  },
  {
    name: 'C12',
    horsepower: 650,
    dollar_value: 648000,
    in_stock: false
  },
  {
    name: 'XKR-S',
    horsepower: 550,
    dollar_value: 132000,
    in_stock: false
  },
  {
    name: 'R8',
    horsepower: 525,
    dollar_value: 114200,
    in_stock: false
  },
  {
    name: 'One-77',
    horsepower: 750,
    dollar_value: 1850000,
    in_stock: true
  },
  {
    name: 'Huayra',
    horsepower: 700,
    dollar_value: 1300000,
    in_stock: false
  },
]


/**
 * 练习题1  使用fp.flowRight重新实现下面函数
 * **/ 
let isLastInStock = function (cars) {
  // 获取最后一条数据
  let last_car = fp.last(cars)
  // 获取最后一条数据的 in_stock属性值、
  return fp.prop('in_stock', last_car)
}


// fp.flowRight()  使用
let flowRightLastFun = fp.flowRight(fp.prop('in_stock'), fp.last)

console.log(flowRightLastFun(cars))


/**
 * 练习题2 使用fp.flowRight、fp.prop、fp.first 获取第一个car的name
 * **/ 
let flowRightFirstFun = fp.flowRight(fp.prop('name'), fp.first)

console.log(flowRightFirstFun(cars))


/**
 * 练习题3 使用帮助函数 _average 重构 averageDollarValue 使用函数组合的方式实现
 * **/ 
let _average = function (xs) {
  return fp.reduce(fp.add, 0, xs) / xs.length
}

// let averageDollarValue = function (cars) {
//   let dollar_values = fp.map(function (car) {
//     return car.dollar_value
//   }, cars)
//   return _average(dollar_values)
// }
// 函数组合
let averageDollarValue = fp.flowRight(_average, fp.map(item => item.dollar_value ))
console.log(averageDollarValue(cars), 'averageDollarValue')


/**
 * 练习题4
 * 使用 flowRight 写一个 sanitizeNames() 函数，
 * 返回一个下划线链接的小写字符串
 * 把数组中的 name 转换为这种形式：例如：
 * sanitizeNames(['Hello World']) => ['hello_world']
 * **/

let _underscore = fp.replace(/\W+/g, '_')

// fp.map(item => {
//   console.log(_underscore(fp.toLower(item)))
//   return _underscore(fp.toLower(item))
// }, ['Hello World'])
let sanitizeNames = fp.flowRight(fp.map(_underscore), fp.map(fp.toLower))
console.log(sanitizeNames(['Hello World', 'HELLO World','Hello WORLD']))








